#if !defined(__xmemfile_h)
#define __xmemfile_h

#include "xfile.h"

//////////////////////////////////////////////////////////
class DLL_EXP CxMemFile : public CxFile
{
public:
    CxMemFile(uint8_t* pBuffer = nullptr, uint32_t size = 0);
    ~CxMemFile();

    bool Open();
    uint8_t* GetBuffer(bool bDetachBuffer = true);

    virtual bool    Close();
    virtual size_t    Read(void *buffer, size_t size, size_t count);
    virtual size_t    Write(const void *buffer, size_t size, size_t count);
    virtual bool    Seek(int32_t offset, int32_t origin);
    virtual int32_t    Tell();
    virtual int32_t    Size();
    virtual bool    Flush();
    virtual bool    Eof();
    virtual int32_t    Error();
    virtual bool    PutC(uint8_t c);
    virtual int32_t    GetC();
    virtual char *    GetS(char *string, int32_t n);
    virtual int32_t    Scanf(const char *format, void* output);

protected:
    bool    Alloc(uint32_t nBytes);
    void    Free();

    uint8_t*    m_pBuffer;
    uint32_t    m_Size;
    bool    m_bFreeOnClose;
    int32_t    m_Position;    //current position
    int32_t    m_Edge;        //buffer size
    bool    m_bEOF;
};

#endif
